package main

func fn1(x int) {
	x = 10
}

func fn2(x *int) {
	*x = 40
}

func main() {
	//var a = 10
	// a的值: 10, a的类型: int, a的地址: 0x14000102020
	//fmt.Printf("a的值: %v, a的类型: %T, a的地址: %p\n", a, a, &a)

	// 指针也是一个变量，但它是一种特殊的变量，它存储的数据不是一个普通的值，而是另
	//一个变量的内存地址。golang中每个变量都有一个自己的内存地址.
	//XXX &取变量的地址, *取指针指向的值
	//var a = 10
	//var p = &a // p指针变量, p的类型 *int(指针类型)
	//// a的值: 10, a的类型: int, a的地址: 0x14000104020
	//// b的值: 0x14000104020, b的类型: *int, b的地址: 0x1400010e030
	//fmt.Printf("a的值: %v, a的类型: %T, a的地址: %p\n", a, a, &a)
	//fmt.Printf("b的值: %v, b的类型: %T, b的地址: %p\n", p, p, &p)

	// 取变量的值
	//var a = 10
	//var p = &a // p指针变量, p的类型 *int(指针类型)
	//// *p 表示取出p这个变量对应的内存地址的值
	//fmt.Println(p)
	//fmt.Println(*p)
	//
	//// 改变内存地址对应的值
	//*p = 30
	//fmt.Println(a)

	//var a = 5
	//fn1(a)
	//fmt.Println(a)
	//fn2(&a)
	//fmt.Println(a)
	//// 指针是更低纬度的引用.
	//*&a = 100
	//fmt.Println(a)

	// 引用数据类型,必须分配空间后, 才能使用
	//var userinfo = make(map[string]string)
	//userinfo["name"] = "张三"
	//fmt.Println(userinfo)

	//var a = make([]int, 5)
	//a[0] = 1
	//fmt.Println(a)

	//var a = make([]int, 0, 10)         // 初始化切片，长度为0，容量为10
	//a = append(a, 1, 2, 3, 4, 5, 6, 7) // 使用append添加7个元素
	//fmt.Println(a)

	// 指针也是引用数据类型
	// a是一个指针变量, 类型是 *int的指针类型, 值是0
	// new方法给指针变量初始化
	//var a = new(int)
	//fmt.Printf("值: %v, 类型: %T, 指针变量对应的值: %v", a, a, *a)

	//var a *int
	//a = new(int)
	//*a = 10
	//fmt.Println(*a)

	//var f = new(bool)
	//fmt.Println(*f)
}
